const fs = require("fs")
const esprima = require("esprima")
const estraverse = require("estraverse")
const escodegen = require("escodegen")
const iconv = require("iconv-lite")
const es_tool = require("../../tools/es_ast_tool")
const akamai_base = require("../common/akamai_base")
const babel_tool = require('../../tools/babel_ast_tool');
const base_tool =  require('../../tools/base_ast_tools');
const {findFuncForConstReturn, findFuncForConstReturnStep2} = require("../common/akamai_base");
const {save_to_file} = require("../../tools/es_ast_tool");
const {get_file} = require("../../tools/utils");


var base_path = "./YvAVvnNNgz";
var code = get_file(base_path+"/1.js");
code= code.replaceAll("[][[]]","undefined");
var ast = es_tool.getAstByString(code);


//step 2
// 二元运算符 计算并返回变量map
var biary_maps = akamai_base.get_binary_func_vars(ast);
console.log("biary_maps:",biary_maps);
// 将变量替换成实际值
es_tool.identifier_tool(ast, biary_maps);
// 处理常量计算
es_tool.binary_tool(ast);
var local_vars = akamai_base.get_literal_vals(ast);
console.log("local_vars:",local_vars);
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, local_vars);

var def_code1 = akamai_base.get_vars_def(ast, 45, 70);
console.log(def_code1);
// 将这些变量初始化的地方找到并执行，执行完获取到map保存
var var_dict1 = es_tool.identifier_tool2(ast, def_code1);
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, var_dict1);
// 替换完了变量就删除
es_tool.delete_vars(ast, var_dict1);

// 处理常量计算
es_tool.binary_tool(ast);
// 删除无用的变量
es_tool.delete_vars(ast, local_vars); // 替换完了变量就删除
// 处理switch case语句
akamai_base.find_switch_case_for(ast);

// 获取中等巨长的变量定义
var def_code2 = akamai_base.get_vars_def(ast, 100, 120);
console.log(def_code2);
// 将这些变量初始化的地方找到并执行，执行完获取到map保存
var var_dict2 = es_tool.identifier_tool2(ast, def_code2);
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, var_dict2);
// // 替换完了变量就删除
es_tool.delete_vars(ast, var_dict2);

// 获取巨长的变量定义
var def_code = akamai_base.get_vars_def(ast, 600, 3000);
console.log(def_code);
// 将这些变量初始化的地方找到并执行，执行完获取到map保存
var var_dict = es_tool.identifier_tool2(ast, def_code)
// 继续 将变量替换成实际值
es_tool.identifier_tool(ast, var_dict);
// 替换完了变量就删除
es_tool.delete_vars(ast, var_dict);
// 逗号表达式拆分
es_tool.sequence_split(ast);

// 对常量值进行重命名
var const_maps = es_tool.ConstReturn(ast);
// 输出map对象
es_tool.MapStr(const_maps);
// 重命名
es_tool.rename_vars(ast, const_maps);

// 简单函数重命名
es_tool.rechange_funcname(ast);

//以下几个步骤查找解密函数子函数并解密子函数名
//1. 找到子函数的常量数组
var map1 = akamai_base.findFuncForConstReturn(ast);
es_tool.MapStr(map1);
//2. 找到返回函数的位置
var map2 = akamai_base.findFuncForConstReturnStep2(ast, map1);
es_tool.MapStr(map2);
var code = "";
map1.forEach((value, key, map)=>{
    code += value;
})
map2.forEach((value, key, map)=>{
    code += value;
})

//3. 执行替换函数
var map3 = akamai_base.replaceFuncForConstReturnStep3(ast, map2, code);
es_tool.MapStr(map3);
akamai_base.insert_hook_destrV2_5(ast, map3);

// 查找sensor_arr 并插入 打印解密字符串map 代码
var var_maps = akamai_base.find_andhook_sensor_arr(ast);
// 重命名
es_tool.rename_vars(ast, var_maps);

// 对常量值进行重命名
var const_maps = es_tool.ConstReturn(ast);
// 输出map对象
es_tool.MapStr(const_maps);
// 重命名
es_tool.rename_vars(ast, const_maps);

akamai_base.addHookSubstr(ast, "YvAVvnNNgz", 217487, 10, "2354657453");
akamai_base.addHookSubstr(ast, "NdVgvjWlxn", 10358, 10, "1169042111");
akamai_base.changeSignFunc(ast, 926689, "2354656720");
akamai_base.changeSignFunc(ast, 13234, "1169041663");


// 根据解密函数插入一些hook代码
// akamai_base.insert_hook_destr(ast, enc_obj);

var newCode = es_tool.getCodeByAst(ast);
newCode= newCode.replace("[][[]]","undefined");
save_to_file(base_path+"/2.js");
// es_tool.save_ast_to_file(ast, base_path+"/2.js");
